<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>78. 子集</title>
  </head>
  <body>
    <script>
      //     给你一个整数数组 nums ，数组中的元素 互不相同 。返回该数组所有可能的子集（幂集）。

      // 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

      //

      // 示例 1：

      // 输入：nums = [1,2,3]
      // 输出：[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
      // 示例 2：

      // 输入：nums = [0]
      // 输出：[[],[0]]

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/subsets
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

      /**
       * @param {number[]} nums
       * @return {number[][]}
       */
      var subsets = function (nums) {
        let res = []
        backtrack([], 0)
        function backtrack(path, start) {
          // 通过解构的方式将数组放入，如果直接将path push,会造成全部为空，
          // 因为数组是引用类型变量，在回溯的时候又会将之清除，所以需要浅拷贝一份
          res.push([...path])
          for (let i = start; i < nums.length; i++) {
            path.push(nums[i])
            backtrack(path, i + 1)
            // 回溯
            path.pop()
          }
        }
        return res
      }

      console.log(subsets([0]))
    </script>
  </body>
</html>
